package com.gexiao.aop.aspects;

import cn.hutool.core.lang.Console;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;

/**
 * 日志切面类
 *
 * @Aspect 说明这个类是切面类
 */
@Aspect
public class LogAspects {

    //切入点表达式，作用是抽取出公共的切入点表达式，引入的时候只需要如：@Before("pointCut()")
    //如果是外部的类引入的时候需要指定方法全路径名，如：@Before("com.gexiao.aop.aspects.LogAspects.pointCut()")
    @Pointcut("execution(public * com.gexiao.aop.bean.MatchCalculator.*(..))")
    public void pointCut() {
    }

    ;

    //@Before里面写的是切入点表达式，指定在哪个方法切入（public int com.gexiao.aop.bean.MatchCalculator.div(int,int)）
    //可以用通配符表示，如：public int com.gexiao.aop.bean.MatchCalculator.*(..) 表示MatchCalculator类下全部的方法都可以执行
    // ".."表示任意参数
    @Before("pointCut()")
    public void logStart(JoinPoint joinPoint) {
        //方法的签名
        Signature signature = joinPoint.getSignature();
        //方法的参数
        Object[] args = joinPoint.getArgs();
        Console.log("方法：{}，运行开始。。。参数列表是：{}", signature.getName(), args);
    }

    @After("com.gexiao.aop.aspects.LogAspects.pointCut()")
    public void logEnd(JoinPoint joinPoint) {
        Console.log("除法运行结束。。。参数列表是，{}", joinPoint.getArgs());
    }

    //joinPoint一定要放在第一位参数
    @AfterReturning(value = "pointCut()", returning = "result")
    public void logResult(JoinPoint joinPoint, Object result) {

        Console.log("方法：{}，正常返回。。。结果是：{}", joinPoint.getSignature().getName(), result);
    }

    @AfterThrowing(value = "pointCut()", throwing = "ex")
    public void logException(Exception ex) {

        Console.log("除法运行异常。。。参数列表是，{}", ex);
    }
}
